package com.waikuai.shop.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.waikuai.shop.entity.WelfareCard;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 额度卡Mapper接口
 * @author waikuai
 */
@Mapper
public interface WelfareCardMapper extends BaseMapper<WelfareCard> {

    /**
     * 根据卡号查询额度卡
     * @param cardNumber 卡号
     * @return 额度卡信息
     */
    WelfareCard selectByCardNumber(@Param("cardNumber") String cardNumber);

    /**
     * 根据卡号和卡密查询额度卡
     * @param cardNumber 卡号
     * @param cardPassword 卡密
     * @return 额度卡信息
     */
    WelfareCard selectByCardNumberAndPassword(@Param("cardNumber") String cardNumber,
                                            @Param("cardPassword") String cardPassword);

    /**
     * 获取用户的额度卡列表
     * @param userId 用户ID
     * @param status 卡状态
     * @return 额度卡列表
     */
    List<WelfareCard> selectCardsByUserId(@Param("userId") Long userId,
                                         @Param("status") Integer status);

    /**
     * 分页查询额度卡列表
     * @param page 分页对象
     * @param status 状态
     * @param batchNo 批次号
     * @param userId 用户ID
     * @return 分页结果
     */
    IPage<WelfareCard> selectCardPage(Page<WelfareCard> page,
                                     @Param("status") Integer status,
                                     @Param("batchNo") String batchNo,
                                     @Param("userId") Long userId);

    /**
     * 统计用户可用额度卡总额
     * @param userId 用户ID
     * @return 总金额
     */
    java.math.BigDecimal sumAvailableAmountByUserId(@Param("userId") Long userId);

    /**
     * 统计各状态的额度卡数量
     * @param status 状态
     * @return 数量
     */
    Integer countCardsByStatus(@Param("status") Integer status);

    /**
     * 获取即将过期的额度卡列表
     * @param days 天数
     * @return 额度卡列表
     */
    List<WelfareCard> selectCardsExpiringSoon(@Param("days") Integer days);

    /**
     * 批量更新额度卡状态
     * @param cardIds 卡ID列表
     * @param status 新状态
     * @return 影响行数
     */
    int updateCardStatusBatch(@Param("cardIds") List<Long> cardIds,
                             @Param("status") Integer status);

    /**
     * 根据批次号查询额度卡
     * @param batchNo 批次号
     * @return 额度卡列表
     */
    List<WelfareCard> selectCardsByBatchNo(@Param("batchNo") String batchNo);
}